package top.fwpsl.util;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

/**
 * date util
 *
 * @auther: 风戏fw
 * @date: 2020/11/21
 */
public class DateUtil {

    public static final int ADD_TYPE_DAY = 0;
    public static final int ADD_TYPE_HOUR = 1;
    public static final int ADD_TYPE_MINUTE = 2;
    public static final int ADD_TYPE_SECOND = 3;

    public static final String DATE_FORMAT = "yyyy-MM-dd";
    public static final String DATE_FORMAT_STR = "yyyy年MM月dd日";
    public static final String DAY_NUMBER = "yyyyMMdd";
    public static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String STANDARD_FORMAT2 = "yyyy-MM-dd HH:mm:ss:SSS";

    /**
     * 根据传入的时间字符串和对应的格式，返回对应格式的日期对象
     *
     * @param time   时间字符串
     * @param format 日期格式
     * @return 日期对象
     */
    public static Date format(String time, String format) {
        try {
            return new SimpleDateFormat(format).parse(time);
        } catch (Exception e) {
            LogHelper.errorLog(e);
            return null;
        }
    }

    /**
     * 根据传入的日期对象和日期格式，返回对应格式的日期字符串
     *
     * @param time   日期对象
     * @param format 日期格式
     * @return 日期字符串
     */
    public static String format(Date time, String format) {
        return new SimpleDateFormat(format).format(time);
    }

    /**
     * 返回当前时间，格式为标准格式（默认格式）
     *
     * @return
     */
    public static String currentTimeFull() {
        return standardFormatFull(new Date());
    }

    /**
     * 带毫秒的时间格式化 yyyy-MM-dd HH:mm:ss:SSS
     *
     * @param date
     * @return
     */
    public static String standardFormatFull(Date date) {
        return format(date, STANDARD_FORMAT2);
    }

    /**
     * 根据传入的日期对象，把它转换成"yyyy-MM-dd"格式的字符串对象
     *
     * @param date 日期对象
     * @return 时间字符串
     */
    public static String dateFormat(Date date) {
        return format(date, DATE_FORMAT);
    }

    /**
     * 根据传入的日期对象，把它转换成"yyyy-MM-dd HH:mm:ss"格式的字符串对象
     *
     * @param date 日期对象
     * @return 时间字符串
     */
    public static String standardFormat(Date date) {
        return format(date, STANDARD_FORMAT);
    }

    /**
     * 转换成 yyyymmdd的格式
     *
     * @param date
     * @return
     */
    public static String dayFormat(Date date) {
        return format(date, DAY_NUMBER);
    }

    /**
     * 转换成 ‘yyyy年MM月dd日’的格式
     *
     * @param date
     * @return
     */
    public static String dateFormatStr(Date date) {
        return format(date, DATE_FORMAT_STR);
    }

    /**
     * 根据传入的日期对象，把它转换成"yyyy-MM-dd HH:mm:ss SSS"格式的字符串对象
     *
     * @param date 日期对象
     * @return 时间字符串
     */
    public static String standardFormat2(Date date) {
        return format(date, STANDARD_FORMAT);
    }

    /**
     * 将Data转为LocalDateTime, 默认系统时区
     *
     * @param date
     * @return
     */
    public static LocalDateTime date2LocalDateTime(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

    /**
     * 将LocalDateTime转为Data, 默认系统时区
     *
     * @param localDateTime
     * @return
     */
    public static Date localDateTime2Date(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 增长指定时长
     *
     * @param date    当前时间
     * @param type    增长时间类型（天，小时，分钟，秒）
     * @param addTime 增长时长
     * @return
     */
    public static LocalDateTime addTime(Date date, Integer type, long addTime) {
        LocalDateTime localDateTime = null;
        if (ADD_TYPE_DAY == type) {
            localDateTime = date2LocalDateTime(date).plusDays(addTime);
        } else if (ADD_TYPE_HOUR == type) {
            localDateTime = date2LocalDateTime(date).plusHours(addTime);
        } else if (ADD_TYPE_MINUTE == type) {
            localDateTime = date2LocalDateTime(date).plusMinutes(addTime);
        } else if (ADD_TYPE_SECOND == type) {
            localDateTime = date2LocalDateTime(date).plusSeconds(addTime);
        } else {
            localDateTime = date2LocalDateTime(date);
        }
        return localDateTime;
    }

}
